Conversation
…different items height.
…esult of branches merging).
app/build.gradle
Outdated
| } | ||
|
|
||
| dependencies { | ||
| implementation fileTree(dir: 'libs', include: ['*.jar']) |
There was a problem hiding this comment.
Зачем папку опять добавил? Нужны какие-то внешние джарники?
app/build.gradle
Outdated
|
|
||
| dependencies { | ||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | ||
| implementation "androidx.cardview:cardview:1.0.0" |
There was a problem hiding this comment.
Саппортные либы должны быть одной версии, для чего имеет вынести её в переменную: для cardview и recyclerview
There was a problem hiding this comment.
Вынес в отдельную переменную.
| super.onCreate(savedInstanceState); | ||
| setContentView(R.layout.activity_news_details); | ||
| news = (News) getIntent().getSerializableExtra(NEWS_KEY); | ||
| setSupportActionBar(findViewById(R.id.toolbar)); |
There was a problem hiding this comment.
Лучше сделать проверку на null, т.к UI может измениться, а об отсутствии тулбара узнаешь уже по крэшу
There was a problem hiding this comment.
Специально не проверял на null, поскольку таким образом можно замаскировать собственную или чужую ошибку (кто-то случайно поменял id у тулбара, или вовсе убрал без предупреждения), а так, по крэшу при тестировании я сразу ошибку увижу, что тулбар почему-то не найден на макете, увижу строчку, в которой ошибка.
There was a problem hiding this comment.
Подход имеет смысл. Зависит от перспективы и приоритетов.
Добро 👍 Классно, что оспариваешь комменты и аргументируешь!
| public class NewsDetailsActivity extends AppCompatActivity { | ||
|
|
||
| private static String NEWS_KEY = "news_key"; | ||
| private final DateFormatter dateFormatter = new DateFormatter(); |
There was a problem hiding this comment.
Согласен - нет смысла каждый раз создавать новый инстанс объекта при открытии экрана.
|
|
||
| public class DateFormatter { | ||
|
|
||
| public CharSequence formatDateTime(Context context, Date dateTime) { |
There was a problem hiding this comment.
Вообще похоже на то, что тебе не нужен инстанс. Это просто статический метод, самый обычный.
There was a problem hiding this comment.
Если делать метод как static, то в таком случае и вызывать его нужно будет не через инстанс, а через класс. И как явную зависимость этот класс уже не объявишь потом - как такового смысла в этом не будет. Или такие классы с небольшой и просто логикой не стоит всегда указывать, как явную зависимость? Или суть в том, что у этого класса нет состояния и, следовательно, создавать инстанс смысла нет?
There was a problem hiding this comment.
Нет состояния, и он больше как Utils-класс. Если бы у тебя была возможность разные конфигурации сделать, подменять реализацию, то да - инстанс
| android:id="@+id/tvBody" | ||
| android:layout_width="0dp" | ||
| android:layout_height="wrap_content" | ||
| android:layout_marginTop="16dp" |
There was a problem hiding this comment.
Базовые димены хорошо бы вынести в dimens.xml
There was a problem hiding this comment.
Константы использовал только для паддингов. Для layout_margin константы не использовал, так как все вьюшки внутри ConstraintLayout располагаются.
| <ImageView | ||
| android:id="@+id/ivImage" | ||
| android:layout_width="100dp" | ||
| android:layout_height="0dp" |
There was a problem hiding this comment.
Сделал, чтобы оно растягивалось при ресайзе? Но я не вижу констрейнта на левый край вьюшки. Тогда почему так?
There was a problem hiding this comment.
Чтобы высота картинки была всегда одинаковой - top вьюшки всегда был на уровне top'a заголовка (tvTitle), а bottom вьюшки был на уровне bottom'a описания новости (tvBody). Чтобы такое поведение обеспечивалось, для заголовка и описания задал фиксированное количество строк (android:lines="2" и android:lines="3" соответственно).

There was a problem hiding this comment.
Упустил то, что ширина вью фиксированная. Всё норм с точки зрения реализации, а с точки зрения UX - спорно - картинка будет вертикальная. Размер шрифта может менять, т.е и высотка текста, и высота картинки тоже, а ширина фикси. И ещё: когда будут короткие тексты, у тебя будет помногу пустого места внизу - возможно не есть гут, и данамическая высота была бы лучше.
There was a problem hiding this comment.
Сделал с помощью барьеров для картинки соотношение высоты к ширине как 1:1 - позволило избавиться от жёстко указанной ширины. На мой взгляд - это всё же минус, когда в одном и том же списке у одинаковых айтемов высота картинки будет разной, поскольку будет зависеть от размера заголовка и дескрипшена. Возможно, что это уже субъективной вопрос, но опыт пользования различными новостными приложениями да и просто приложениями, где есть список, подсказывает, что картинка всё должна быть одинаковой на всех айтемах. Да и желательно квадратной (1:1).
| android:id="@+id/tvTitle" | ||
| android:layout_width="0dp" | ||
| android:layout_height="wrap_content" | ||
| android:background="#b4c6c5c5" |
| android:layout_width="wrap_content" | ||
| android:layout_height="wrap_content" | ||
| android:layout_marginStart="16dp" | ||
| android:layout_marginTop="8dp" |
There was a problem hiding this comment.
Константы использовал только для паддингов. Для layout_margin константы не использовал, так как все вьюшки внутри ConstraintLayout располагаются.
|
|
||
| public Builder() { | ||
| typeToAdapterMap = new SparseArray<>(); | ||
| typeToAdapterMap = new HashMap<>(); |
There was a problem hiding this comment.
Лучше юзать ArrayMap, для более эффективной работы по памяти. Т.к тебе не надо постоянно изменять мапу, а только несколько раз добавить в неё, а потом лишь читать.
…e new instance of it every time.
…memory efficiency
app/src/main/res/values/colors.xml
Outdated
| <color name="colorPrimaryDark">#ffd4a515</color> | ||
| <color name="colorAccent">#ff962326</color> | ||
| <color name="window_background">?android:attr/colorBackground</color> | ||
| <color name="background_transparent_grey">#b4c6c5c5</color> |
There was a problem hiding this comment.
Если ты прям акцент хочет на цвете сделать (и много где его юзать), то ок.
А вот если тут акцент скорее на назначении, типа "цвет фона карточки", то может лучше именно так его и назвать. Т.к он может поменяться, но не надо будет ещё и название менять (если он станет, например, синим). Но это не обязательно к исправлению, просто имей в виду.
There was a problem hiding this comment.
Создал отдельную константу для фона заголовка карточки
|
|
||
| public class DateFormatter { | ||
|
|
||
| public CharSequence formatDateTime(Context context, Date dateTime) { |
There was a problem hiding this comment.
Нет состояния, и он больше как Utils-класс. Если бы у тебя была возможность разные конфигурации сделать, подменять реализацию, то да - инстанс
colriot
left a comment
There was a problem hiding this comment.
В целом approve. Есть мелкие замечания в ответах на комменты, то не критичны
| <ImageView | ||
| android:id="@+id/ivImage" | ||
| android:layout_width="100dp" | ||
| android:layout_height="0dp" |
There was a problem hiding this comment.
Упустил то, что ширина вью фиксированная. Всё норм с точки зрения реализации, а с точки зрения UX - спорно - картинка будет вертикальная. Размер шрифта может менять, т.е и высотка текста, и высота картинки тоже, а ширина фикси. И ещё: когда будут короткие тексты, у тебя будет помногу пустого места внизу - возможно не есть гут, и данамическая высота была бы лучше.
DateFormatter has no behaviour and so it is most preferably to not create redundant instances.
it helps to save scroll position in time of orientation changing.
View Exercise 3.